package org.dllwh.milvus.v1;

import io.milvus.client.MilvusServiceClient;
import io.milvus.param.R;
import io.milvus.param.RpcStatus;
import io.milvus.param.partition.CreatePartitionParam;
import io.milvus.param.partition.LoadPartitionsParam;
import io.milvus.param.partition.ReleasePartitionsParam;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName MilvusPartitionHelper
 * @Description Milvus V1 分区操作
 * @Author: <a href="mailto:duleilewuhen@sina.com">独泪了无痕</a>
 * @Date 2025-05-24 14:37
 * @版本 V 1.0.1
 * @since JDK 17
 */
@Slf4j
public class MilvusPartitionHelper {
    /**
     * 一旦集合就绪，就可以列出其分区。
     */
    public void listPartitions() {

    }

    /**
     * 创建分区。
     *
     * @param collectName   指定集合名称
     * @param partitionName 指定分区名称
     */
    public void createPartition(String collectName, String partitionName) {
        MilvusServiceClient milvusClient = MilvusConnectHelper.getMilvusServiceClient();
        CreatePartitionParam createPartitionParam = CreatePartitionParam.newBuilder()
                .withCollectionName(collectName)
                .withPartitionName(partitionName)
                .build();
        R<RpcStatus> response = milvusClient.createPartition(createPartitionParam);
        if (response.getStatus() != R.Status.Success.getCode()) {
            log.error("创建当前连接的数据库中的集合{}分区失败，失败原因是：{}", collectName, response.getMessage());
        }
    }

    /**
     * 检查特定分区
     */
    public void hasPartition() {

    }


    /**
     * 获取加载状态。
     * <p>
     * 已加载：如果一个 Collection 中至少有一个分区已加载，则标记为Loaded 。
     * <p>
     * 未加载：如果一个 Collection 的任何分区都未加载，则将其标记为NotLoad 。
     * <p>
     * 加载中：如果某个 Collection 中至少有一个分区处于加载过程中，则该 Collection 会被标记为 Loading。
     */
    public void getLoadState() {

    }


    /**
     * 加载 Collections 的所有分区
     */
    public void loadPartition() {

    }

    /**
     * 加载 Collections 的特定分区
     *
     * @param collectName       指定集合名称
     * @param partitionNameList 指定分区名称
     */
    public void loadPartitions(String collectName, List<String> partitionNameList) {
        MilvusServiceClient milvusClient = MilvusConnectHelper.getMilvusServiceClient();
        LoadPartitionsParam loadPartitionsParam = LoadPartitionsParam.newBuilder()
                .withCollectionName(collectName)
                .withPartitionNames(partitionNameList)
                .build();
        R<RpcStatus> response = milvusClient.loadPartitions(loadPartitionsParam);
        if (response.getStatus() != R.Status.Success.getCode()) {
            log.error("加载当前连接的数据库中的集合（{}）分区（{}）失败，失败原因是：{}", collectName, String.join(",", partitionNameList), response.getMessage());
        }
    }

    /**
     * 释放分区后，如果不再需要，就可以将其丢弃。
     */
    public void dropPartition() {

    }

    /**
     * 释放集合的特定分区
     *
     * @param collectName       指定集合名称
     * @param partitionNameList 指定分区名称
     */
    public void releasePartitions(String collectName, List<String> partitionNameList) {
        MilvusServiceClient milvusClient = MilvusConnectHelper.getMilvusServiceClient();
        ReleasePartitionsParam releasePartitionsParam = ReleasePartitionsParam.newBuilder()
                .withCollectionName(collectName)
                .withPartitionNames(partitionNameList)
                .build();
        R<RpcStatus> response = milvusClient.releasePartitions(releasePartitionsParam);
        if (response.getStatus() != R.Status.Success.getCode()) {
            log.error("释放当前连接的数据库中的集合（{}）分区（{}）失败，失败原因是：{}", collectName, String.join(",", partitionNameList), response.getMessage());
        }
    }
}
